// Copyright 2020 Salesforce.com, Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: prod-OptionalExpression
description: >
  Productions for ?. IdentifierName
info: |
  OptionalChain[Yield, Await]:
    ?. IdentifierName
features: [optional-chaining]
---*/

function Test() {
    const arr = [10, 11];
    const obj = {
      a: 'hello'
    };

    assert.sameValue(obj?.a, 'hello');
    assert.sameValue(obj?.\u0061, 'hello');
    assert.sameValue(obj?.\u{0061}, 'hello');

    assert.sameValue(obj?.\u0062, undefined);
    assert.sameValue(obj?.\u{0062}, undefined);

    assert.sameValue(arr ?. length, 2);
    assert.sameValue(arr ?. l\u0065ngth, 2);
    assert.sameValue(arr ?. l\u{0065}ngth, 2);

    assert.sameValue(obj?.$, undefined);

    obj.$ = 42;
    assert.sameValue(obj?.$, 42);

    assert.sameValue(obj?._, undefined);

    obj._ = 39;
    assert.sameValue(obj?._, 39);
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
